package com.dkm.orproject.dkmoa.service.serviceimpl;

import com.dkm.orproject.dkmoa.dao.OaInformMapper;
import com.dkm.orproject.dkmoa.dao.OaMessageMapper;
import com.dkm.orproject.dkmoa.dao.OaVoteMapper;
import com.dkm.orproject.dkmoa.dao.OaVoteOptionMapper;
import com.dkm.orproject.dkmoa.domain.*;
import com.dkm.orproject.dkmoa.service.OaVoteService;
import com.dkm.orproject.utils.utils.IdToobtainUtils;
import com.github.pagehelper.PageHelper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ClassName : OaVoteServiceImpl  //类名
 * @Description : 投票服务接口实现类  //描述
 * @Author : 易嵘  //作者
 * @Date: 2020-11-25 16:11  //时间
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class OaVoteServiceImpl implements OaVoteService {

    /**
     * 投票Mapper
     */
    @Resource
    OaVoteMapper voteMapper;

    /**
     * 投票选项Mapper
     */
    @Resource
    OaVoteOptionMapper voteOptionMapper;

    /**
     * 通知人员关联Mapper
     */
    @Resource
    OaInformMapper informMapper;

    /**
     * 通知Mapper
     */
    @Resource
    OaMessageMapper messageMapper;

    /**
     * id生成工具
     */
    @Resource
    IdToobtainUtils idToobtainUtils;

    /**
     * id查询
     *
     * @param id 投票id
     * @return 投票模型
     */
    @Override
    public OaVote selectByPrimaryKey(Long id) {
        return voteMapper.selectByPrimaryKey(id);
    }

    /**
     * id删除
     *
     * @param id 投票id
     * @return 回调函数
     */
    @Override
    public int deleteByPrimaryKey(Long id) {
        return voteMapper.deleteByPrimaryKey(id);
    }

    /**
     * 批量查询
     *
     * @param list 投票id集
     * @return 查询结果
     */
    @Override
    public List<OaVote> selectAll(List<Long> list) {
        return voteMapper.selectAll(list);
    }

    /**
     * 批量删除
     *
     * @param list 投票id集
     * @return 回调函数
     */
    @Override
    public int deleteAll(List<Long> list) {
        return voteMapper.deleteAll(list);
    }

    /**
     * 新增
     *
     * @param vote           投票模型
     * @param personnelId    通知人集合
     * @param voteOptionName 选项名称
     * @param personnel  创建人名称
     * @return 回调函数
     */
    @Override
    public int add(OaVote vote, String personnelId, String[] voteOptionName, OaPersonnel personnel) {
        vote.setPkVoteId(idToobtainUtils.getNumberId());
        vote.setCreatedBy(personnel.getPersonnelName());
        vote.setIsRevision("1");
        if (voteOptionName != null && voteOptionName.length > 0) {
            List<OaVoteOption> voteOptions = new ArrayList<>();
            for (String s : voteOptionName) {
                OaVoteOption voteOption = new OaVoteOption();
                voteOption.setPkVoteOptionId(idToobtainUtils.getNumberId());
                voteOption.setVoteOptionName(s);
                voteOption.setIsRevision("1");
                voteOption.setCreatedBy(personnel.getPersonnelName());
                voteOption.setVoteId(vote.getPkVoteId());
                voteOptions.add(voteOption);
            }
            voteOptionMapper.insertAll(voteOptions);
        } else {
            return 0;
        }

        // 新建通知
        OaMessage message = new OaMessage();
        //通知id
        message.setPkMessageId(idToobtainUtils.getNumberId());
        //创建人
        message.setCreatedBy(personnel.getPersonnelName());
        //流程id
        message.setFormId(vote.getPkVoteId());
        // 通知标题
        message.setMessageName(vote.getVoteName());
        //状态 2 待办
        message.setIsRevision("2");
        // 链接地址
        message.setMessageUrl("pages/dkmoa/front/vote/votePersonnel.html?pkVoteId=");
        // 新增通知
        messageMapper.insertSelective(message);

        String[] personnels = personnelId.split(",");
        List<OaInform> informs = new ArrayList<>();
        for (String personnelName : personnels) {
            OaInform inform = new OaInform();
            inform.setFkInformId(idToobtainUtils.getNumberId());
            inform.setPersonnelId(Long.valueOf(personnelName));
            inform.setMessageId(message.getPkMessageId());
            inform.setIsState("0");
            informs.add(inform);
        }
        OaInform inform = new OaInform();
        inform.setFkInformId(idToobtainUtils.getNumberId());
        inform.setPersonnelId(personnel.getPkPersonnelId());
        inform.setMessageId(message.getPkMessageId());
        inform.setIsState("0");
        informs.add(inform);
        informMapper.insertAll(informs);

        return voteMapper.insertSelective(vote);
    }

    /**
     * 条件修改
     *
     * @param vote 投票模型
     * @return 回调函数
     */
    @Override
    public int updateByPrimaryKeySelective(OaVote vote) {
        return voteMapper.updateByPrimaryKeySelective(vote);
    }

    /**
     * 分页查询
     *
     * @param voteName  投票名称
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param page      当前页数
     * @param limit     显示行数
     * @param pkPersonnelId 操作人id
     * @return 查询结果
     */
    @Override
    public List<OaVote> findAll(String voteName, String startTime, String endTime, Integer page, Integer limit, Long pkPersonnelId) {
        PageHelper.startPage(page, limit);
        return voteMapper.findAll(voteName, startTime, endTime,pkPersonnelId);
    }

    /**
     * 总行数
     *
     * @param voteName  投票名称
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pkPersonnelId 操作人id
     * @return 总行数
     */
    @Override
    public Long rowCount(String voteName, String startTime, String endTime,Long pkPersonnelId) {
        return voteMapper.rowCount(voteName, startTime, endTime,pkPersonnelId);
    }

    /**
     * 判断当前登录人是否投票
     *
     * @param voteId    投票id
     * @param personnel 操作人
     * @return 0未投票，1投票
     */
    @Override
    public int isVote(Long voteId, OaPersonnel personnel) {
        return voteMapper.isVote(voteId, personnel.getPkPersonnelId());
    }

    /**
     * 根据投票id查询投票选项
     *
     * @param voteId 投票id
     * @return
     */
    @Override
    public List<Map<String, Object>> voteOptionShow(Long voteId) {
        List<Map<String, Object>> maps = new ArrayList<>();
        //查询出对应的投票选项
        List<OaVoteOption> voteOptions = voteOptionMapper.voteOptionShow(voteId);
        //投票总人数
        Integer rowAll = voteMapper.rowAll(voteId);
        for (OaVoteOption voteOption : voteOptions) {
            Map<String, Object> map = new HashMap<>(16);
            //投票选项名称
            map.put("voteOption", voteOption);
            //得到该选项投票数
            Integer voteRow = voteMapper.voteRow(voteOption.getPkVoteOptionId());
            int x = 0;
            if (rowAll > 0 && voteRow > 0) {
                //计算出占比值
                double f = (voteRow * 1.0) / (rowAll * 1.0);
                //转换为BigDecimal类型
                BigDecimal b = new BigDecimal(f);
                //截取前俩位小数
                double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                //转换为int类型
                x = (int) (f1 * 100);
            }
            //投票数
            map.put("amount", x);
            maps.add(map);
        }

        return maps;
    }
}
